package com.swn.common.util;

import java.io.*;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;


/**
 * @ClassName: PropertiesFileUtil 
 * @Description:  properties 文件工具类
 * @author: LiGang
 * @date 2015-11-27 下午2:28:12 
 * @change 2015-11-27 下午5:05:51 
 */
public class PropertiesFileUtil {
	
    private static Logger logger = Logger.getLogger("PropertiesFileUtil.class");

    /**
     * 根据 给定的 key 值 和 fileName 的 property 文件名称 从当前资源库或者其父资源库中获取一个 String 字符串 
     * 
     * @Description TODO 	根据 给定的 key 值 从当前资源库或者其父资源库中获取一个 String 字符串
     * 						调用此方法 等价于 (String) {@link #getObject(java.lang.String) getObject}(key) 方法
     * 						参考  {@link #getBundle(String, Locale, ClassLoader) getBundle}
     * 						for a complete description of the search and instantiation strategy.
     * 
     * @param key 		String 要求的  String  类型的 键 key
     * @param fileName 	String 要求的  String  类型  fileName 的无后缀名称 
     * 					或者     fileName 全限定名 （无后缀名称）
     * 
     * @exception NullPointerException		如果 key == null 	出现空指针异常 	
     * 										如果 fileName == null 出现空指针异常
     * @exception MissingResourceException 	如果根据 key 没有找到对象  出现资源缺失异常
     * 										如果根据 fileName 没有获取到资源 出现资源缺失异常
     * @exception ClassCastException 		如果根据 key 获取的对象不是 String 类型  出现类转型异常
     * 
     * @return String 返回根据 key 获取的 String 类型的资源
     */
    public static String getResourceAsString(String fileName, String key){
    	//根据 fileName 得到资源库 	默认从本地加载资源
    	ResourceBundle bundle = ResourceBundle.getBundle(fileName);
    	return bundle.getString(key);
    }
    
    /**
     * 根据 给定的 key 值 从根据 java.io.InputStream 对象创建的资源库中获取一个 String 字符串 
     * 
     * @Description TODO 	根据 给定的 key 值 从根据 InputStream 对象创建的资源库中获取一个 String 字符串
     * 						InputStream 的编码必须为 ISO-8859-1 编码
     * 						参考 (String) {@link #getObject(java.lang.String) getObject}(key) 方法
     * 
     * @param stream java.io.InputStream 	从典型的property文件读取的单个字节流对象
     * @param key 	 java.lang.String 		要求的  String  类型的 键 key
     * 
     * @exception IOException 				如果 I/O 出错 	出现 I/O异常
     * @exception NullPointerException 		如果 stream == null 出现空指针异常
     * 										如果 key == null 	出现空指针异常
     * @exception MissingResourceException 	如果根据 key 没有找到对象  出现资源缺失异常
     * @exception ClassCastException 		如果根据 key 获取的对象不是 String 类型  出现类转型异常						
     */
    public static String getResourceAsString(InputStream stream, String key) throws IOException{
    	//根据 stream 得到资源库 InputStream 的编码必须为 ISO-8859-1 编码
    	ResourceBundle bundle = new PropertyResourceBundle(stream);
    	return bundle.getString(key);
    }
    
    /**
     * 根据 给定的 key 值 从根据 java.io.Reader 对象创建的资源库中获取一个 String 字符串 
     * 
     * @Description TODO	根据 给定的 key 值 从根据 java.io.Reader 对象创建的资源库中获取一个 String 字符串
     * 						java.io.Reader 对象的构造器无编码要求
     * 
     * 						参考 {@link #PropertyResourceBundle(java.io.InputStream) PropertyResourceBundle(InputStream)},
     * 						这里对 properties 文件编码格式没有要求
     *
     * @param reader java.io.Reader 		从典型的property文件读取的单个字符流对象
     * @param key 	 java.lang.String 		要求的  String  类型的 键 key
     * 
     * @exception IOException 				如果 I/O 出错 	出现 I/O异常
     * @exception NullPointerException 		如果 stream == null 出现空指针异常
     * 										如果 key == null 	出现空指针异常
     * @exception MissingResourceException 	如果根据 key 没有找到对象  出现资源缺失异常
     * @exception ClassCastException 		如果根据 key 获取的对象不是 String 类型  出现类转型异常		
     * @since 1.6 JDK 要求 1.6+
     */
    public static String getResourceAsString(Reader reader, String key) throws IOException{
    	//根据 reader 得到资源库 	JDK 要求 1.6+		构造器无编码要求
    	ResourceBundle bundle = new PropertyResourceBundle(reader);
    	return bundle.getString(key);
    }
    
    /**
     * 根据键获得相应的值
     * @param path 路径
     * @param key 键
     * @return
     */
    public static String getValueByKey(String path, String key) {
        Properties properties = getProperties(path);
        return  properties.getProperty(key);
    }

    /**
     * 获取配置文件
     * @param path
     * @return
     */
    public static Properties getProperties(String path){
        try {
            //获取绝对路径
        	 Properties props = new Properties();
        	 props.load(new InputStreamReader(PropertiesFileUtil.class.getClassLoader().getResourceAsStream(path),"UTF-8"));          
            return props ;
        } catch (IOException e) {
        	logger.error(e.toString());
            return null;
        }
    }

    /**
     * @Title main 
     * @Description TODO 测试main方法
     */
    public static void main(String[] args) {
    	//System.out.println(getResourceAsString("plugin", "pluginName"));
    }
}
